package com.yangchuang.openpicture.service.impl;

import com.yangchuang.openpicture.constant.RedisConstants;
import com.yangchuang.openpicture.service.TokenBlacklistService;
import com.yangchuang.openpicture.util.JwtUtil;
import com.yangchuang.openpicture.util.RedisUtils;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.util.concurrent.TimeUnit;

//因为设计到具体的业务逻辑 所以使用@service
@Service
@RequiredArgsConstructor
@Slf4j
public class TokenBlacklistServiceImpl implements TokenBlacklistService {
    private final JwtUtil jwtUtil;
    private final RedisUtils redisUtils;


    /**
     * 将Token加入黑名单  同时 设置 token的过期时间为 token的剩余生命时间
     */
    public void addToBlacklist(String token) {
        long remainingTime = jwtUtil.getTokenRemainingTime(token);
        //使用截断式编程
        if (jwtUtil.getTokenRemainingTime(token) < 0) {
            return;
        }
        String key = RedisConstants.BLACKLIST_KEY_PREFIX + token;
        if (redisUtils.string().exists(key)) {
            System.out.println("黑名单中token重复,本次不存储");
            return;
        }
        //剩下的就是合法的情况 有剩余时间 且 现在的redis里面没有
        //将token放进redis里面
        System.out.println("将token加入到黑名单中：" + token);
        redisUtils.string().addWithTTL(RedisConstants.BLACKLIST_KEY_PREFIX + token, "1",
                remainingTime, TimeUnit.MILLISECONDS);
    }

    /**
     * 检查Token是否在黑名单中
     */
    public boolean isBlacklisted(String token) {
        //放进去的规则是：BLACKLIST_PREFIX+token
        //用相同的规则去redis里面检查是否存在 存在 不存在，可能已经是死了 则 可以用
        return redisUtils.string().exists(RedisConstants.BLACKLIST_KEY_PREFIX + token);
    }
}
